//对象序列化，undefined和函数丢失问题
const JSONStringify = (option) => {
    return JSON.stringify(option,
        (key,val) => {
            // 处理函数丢失问题
            if (typeof val === "function") {
                return `${val}`;
            }
            //处理undefined丢失问题
            if (typeof val === 'undefined') {
                return 'undefined';
            }
            return val;
        },
        2
    )
}
//对象序列化解析
const JSONParse = (objstr) => {
    return JSON.parse(objstr,(k,v) => {
        if (typeof v === 'string' && v.indexOf && v.indexOf('function') > -1){
            // eval 可能在eslint 中报错，需要加入下行注释
            // eslint-disable-next-line
            return eval(`(function(){return ${v}})()`);
        }
        return v;
    });
}

function JSONDeepClone(obj) {
    //判断拷贝的要进行深拷贝的是数组还是对象，是数组的话进行数组拷贝，对象的话进行对象拷贝
    var objClone = Array.isArray(obj) ? [] : {};
    //进行深拷贝的不能为空
    if (obj && typeof obj === "object") {
        for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
                if (obj[key] && typeof obj[key] === "object") {
                    objClone[key] = JSONDeepClone(obj[key]);
                } else {
                    objClone[key] = obj[key];
                }
            }
        }
    }else if (obj && typeof obj === "function"){
        objClone = obj;
        // objClone[key] = JSONParse(JSONStringify(obj[key]));
    }
    return objClone;
}

//测试
export {
    JSONStringify,
    JSONParse,
    JSONDeepClone
}
